// Dart隔离区(Isolates)教学示例
// 从基础到高级逐步展示Dart并发编程的核心概念

import 'dart:isolate';

/*
 * 第一部分：隔离区基础概念
 * 1. 每个隔离区有自己的内存堆
 * 2. 隔离区之间通过消息传递通信
 * 3. 避免共享状态带来的并发问题
 */

// 基础示例1：隔离区的基本使用
void basicIsolateExample() async {
  print('\n基础示例1：隔离区的基本使用');
  print('-------------------');

  // 创建接收端口
  final receivePort = ReceivePort();

  // 启动隔离区
  await Isolate.spawn((sendPort) {
    // 隔离区内的代码
    sendPort.send('来自隔离区的消息');
    sendPort.send('done');
  }, receivePort.sendPort);

  // 监听消息
  try {
    await for (var msg in receivePort) {
      print('主隔离区收到: $msg');
      if (msg == 'done') {
        receivePort.close();
        break;
      }
    }
  } catch (e) {
    print('隔离区通信错误: $e');
    receivePort.close();
  }
}

// 基础示例2：隔离区执行计算任务
void computeInIsolate() async {
  print('\n基础示例2：隔离区执行计算任务');
  print('-------------------');

  final receivePort = ReceivePort();

  await Isolate.spawn((sendPort) {
    // 模拟计算密集型任务
    int sum = 0;
    for (int i = 0; i < 1000000; i++) {
      sum += i;
    }
    sendPort.send('计算结果: $sum');
    sendPort.send('done');
  }, receivePort.sendPort);

  try {
    await for (var msg in receivePort) {
      print('主隔离区收到: $msg');
      if (msg == 'done') {
        receivePort.close();
        break;
      }
    }
  } catch (e) {
    print('隔离区通信错误: $e');
    receivePort.close();
  }
}

/*
 * 第二部分：高级用法
 * 1. Flutter中的compute函数
 * 2. Isolate.run简化API
 */

// 高级示例1：模拟Flutter的compute函数
void simulateCompute() {
  print('\n高级示例1：Flutter的compute函数');
  print('-------------------');
  print('// 在Flutter中可这样使用:');
  print('final result = await compute(heavyTask, input);');
  print('// compute内部使用Isolate实现，简化了隔离区管理');
}

// 高级示例2：使用Isolate.run简化一次性任务
Future<void> useIsolateRun() async {
  print('\n高级示例2：使用Isolate.run');
  print('-------------------');

  // 定义一个计算密集型函数
  int slowFib(int n) => n <= 1 ? 1 : slowFib(n - 1) + slowFib(n - 2);

  // 自动管理隔离区生命周期
  try {
    final result = await Isolate.run(() => slowFib(35));
    print('计算结果: $result');
  } catch (e) {
    print('隔离区计算错误: $e');
  }
}

/*
 * 主函数：按教学顺序运行示例
 */
void main() async {
  print('Dart隔离区教学示例');
  print('===================');

  // 运行基础示例
  basicIsolateExample();
  computeInIsolate();

  // 运行高级示例
  simulateCompute();
  await useIsolateRun();

  // 总结
  print('\n总结:');
  print('1. 隔离区是Dart实现并发的核心机制');
  print('2. 每个隔离区有自己的内存堆，通过消息传递通信');
  print('3. 使用compute和Isolate.run可以简化隔离区管理');
}
